import logging
import os
from logging.handlers import RotatingFileHandler
from typing import Dict

# 日志文件配置常量
LOG_DIR = 'logs'  # 日志文件目录
LOG_MAX_BYTES = 5 * 1024 * 1024  # 单个日志文件最大大小（5MB）
LOG_BACKUP_COUNT = 100  # 保留的日志文件数量
LOG_ENCODING = 'utf-8'  # 日志文件编码
LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'  # 日志格式

# 用于存储已创建的处理器
_file_handlers: Dict[str, RotatingFileHandler] = {}

def get_file_handler(log_file: str) -> RotatingFileHandler:
    """获取或创建文件处理器
    
    Args:
        log_file: 日志文件路径
        
    Returns:
        RotatingFileHandler: 文件处理器
    """
    if log_file not in _file_handlers:
        # 确保日志目录存在
        os.makedirs(os.path.dirname(log_file), exist_ok=True)
        
        # 创建新的文件处理器
        handler = RotatingFileHandler(
            log_file,
            maxBytes=LOG_MAX_BYTES,
            backupCount=LOG_BACKUP_COUNT,
            encoding=LOG_ENCODING
        )
        handler.namer = lambda name: name.replace('.log', '') + '.log'
        handler.setFormatter(logging.Formatter(LOG_FORMAT))
        _file_handlers[log_file] = handler
    
    return _file_handlers[log_file]

def setup_logger(name: str, log_file: str, level=logging.DEBUG):
    """设置日志记录器
    
    Args:
        name: 日志记录器名称
        log_file: 日志文件路径
        level: 日志级别，默认DEBUG
    
    Returns:
        logging.Logger: 配置好的日志记录器
    """
    # 创建日志记录器
    logger = logging.getLogger(name)
    logger.setLevel(level)
    
    # 如果已经有处理器，先清除
    logger.handlers = []
    
    # 获取或创建文件处理器
    file_handler = get_file_handler(log_file)
    file_handler.setLevel(logging.DEBUG)
    
    # 控制台处理器：只记录INFO及以上级别的日志
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)
    console_handler.setFormatter(logging.Formatter(LOG_FORMAT))
    
    # 添加处理器到记录器
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)
    
    # 防止日志传递给父记录器
    logger.propagate = False
    
    return logger

def setup_sqlalchemy_logger(log_file: str):
    """设置SQLAlchemy相关日志
    
    Args:
        log_file: 日志文件路径
    """
    # 配置所有SQLAlchemy相关日志
    sqlalchemy_loggers = [
        'sqlalchemy.engine',
        'sqlalchemy.pool',
        'sqlalchemy.dialects',
        'sqlalchemy.orm',
        'sqlalchemy.sql'
    ]
    
    # 获取或创建文件处理器
    file_handler = get_file_handler(log_file)
    
    for logger_name in sqlalchemy_loggers:
        sqlalchemy_logger = logging.getLogger(logger_name)
        sqlalchemy_logger.handlers = []  # 清除现有处理器
        sqlalchemy_logger.addHandler(file_handler)
        sqlalchemy_logger.setLevel(logging.DEBUG)
        sqlalchemy_logger.propagate = False

def setup_fastapi_logger(log_file: str):
    """设置FastAPI访问日志
    
    Args:
        log_file: 日志文件路径
    """
    fastapi_logger = logging.getLogger('uvicorn.access')
    fastapi_logger.handlers = []
    
    # 获取或创建文件处理器
    file_handler = get_file_handler(log_file)
    file_handler.setLevel(logging.INFO)
    
    fastapi_logger.addHandler(file_handler)
    fastapi_logger.setLevel(logging.INFO)
    fastapi_logger.propagate = False 